<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="../00.依赖包/react.development.js"></script>
  <script src="../00.依赖包/react-dom.development.js"></script>
  <script src="../00.依赖包/babel.min.js"></script>
  <script src="../00.依赖包/prop-types.js"></script>
</head>

<body>
  <div id="app"></div>
  <script type="text/babel">

    /* 
      父子组件挂载流程：
      constructor:父创建组件时的构造器函数
      componentWillMount:父组件即将挂载
      render:父组件挂载中
      constructor:子创建组件时的构造器函数
      componentWillMount:子组件即将挂载
      render:子组件挂载中
      componentDidMount:子组件挂载完成
      componentDidMount:父组件挂载完成

    */

    /* 
    父子组件更新流程:
    constructor:父创建组件时的构造器函数
    componentWillMount:父组件即将挂载
    render:父组件挂载中
    constructor:子创建组件时的构造器函数
    componentWillMount:子组件即将挂载
    render:子组件挂载中
    componentDidMount:子组件挂载完成
    componentDidMount:父组件挂载完成
    shouldComponentUpdate:父组件是否应该更新
    componentWillUpdate:父组件即将更新
    render:父组件挂载中
    shouldComponentUpdate:子组件是否应该更新
    componentWillUpdate:子组件即将更新
    render:子组件挂载中
    componentDidUpdate:子组件已经更新完成
    componentDidUpdate:父组件已经更新完成
    
    父子组件的卸载流程:
      componentWillUnmount:父组件即将卸载
      componentWillUnmount:子组件即将卸载
    */

    //父组件
    class Father extends React.Component{
      constructor(){
        super()
        console.log('constructor:父创建组件时的构造器函数');
      }

      state={
        count:0
      }

      UNSAFE_componentWillMount(){
        console.log("componentWillMount:父组件即将挂载");
      }
        render(){
          console.log('render:父组件挂载中');
          const {count} = this.state
          return (
            <div>
               <h1>老头+{count}</h1>
               <button onClick={this.changeNum}>老头+1</button>
               <Son/>
            </div>
          )
        } 

        changeNum =()=>{
          const {count} = this.state
          this.setState({count:count+1})
        }

      //主要用户执行组件初始化的操作:比如ajax请求,定时器,订阅等
      componentDidMount(){
        console.log("componentDidMount:父组件挂载完成");
      }  

      shouldComponentUpdate(){
        console.log("shouldComponentUpdate:父组件是否应该更新");
        return true;
      }
      UNSAFE_componentWillUpdate(){
        console.log("componentWillUpdate:父组件即将更新");
      }
      componentDidUpdate(){
        console.log("componentDidUpdate:父组件已经更新完成");
      }
      //常用:主要做收尾工作,清定时器 取消订阅 ...
      componentWillUnmount(){
        console.log("componentWillUnmount:父组件即将卸载");
      }
    }
    //子组件
    class Son extends React.Component{
      constructor(){
        super()
        console.log("constructor:子创建组件时的构造器函数");
      }
      UNSAFE_componentWillMount(){
        console.log("componentWillMount:子组件即将挂载");
      }
      render(){
        console.log("render:子组件挂载中");
        return(
          <h1>儿子</h1>
        )
      }
      componentDidMount(){
        console.log("componentDidMount:子组件挂载完成");
      }  
      shouldComponentUpdate(){
        console.log("shouldComponentUpdate:子组件是否应该更新");
        return true;
      }
      UNSAFE_componentWillUpdate(){
        console.log("componentWillUpdate:子组件即将更新");
      }
      componentDidUpdate(){
        console.log("componentDidUpdate:子组件已经更新完成");
      }
      //常用:主要做收尾工作,清定时器 取消订阅 ...
      componentWillUnmount(){
        console.log("componentWillUnmount:子组件即将卸载");
      }
    }
    

    const root = ReactDOM.createRoot(document.getElementById('app'));
    root.render(<Father/>)

  </script>
</body>

</html>